package com.yn.xgame;

import com.google.protobuf.GeneratedMessage;
import com.yn.xgame.util.CtxUtils;
import io.netty.channel.ChannelHandlerContext;

import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/**
 * CtxManager
 * Created by wangboo on 17/7/13.
 */
public class CtxManager {

    private Map<Long, ChannelHandlerContext> map = new HashMap<>(256);
    private Map<Long, ChannelHandlerContext> loginedMap = new HashMap<>(256);

    public void add(ChannelHandlerContext ctx) {
        long sid = UUID.randomUUID().getMostSignificantBits();
        CtxUtils.setId(ctx, sid);
        map.put(sid, ctx);
    }

    public void remove(ChannelHandlerContext ctx) {
        long id = CtxUtils.getId(ctx);
        CtxUtils.setId(ctx, -1); // id设置为作废
        map.remove(id);
        loginedMap.remove(id);
    }

    public void logined(ChannelHandlerContext ctx) {
        long id = CtxUtils.getId(ctx);
        loginedMap.put(id, ctx);
    }

    public int size() {
        return map.size();
    }

    public int loginSize() {
        return loginedMap.size();
    }

    public void brocast(GeneratedMessage msg) {
        loginedMap.values().forEach(ctx -> ctx.writeAndFlush(msg));
    }


    public ChannelHandlerContext get(long id) {
        return map.get(id);
    }
}
